From dd0403c3f25728c61c0c3bc2b6fcaab56a89b9f4 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Wed, 21 Sep 2005 10:13:11 +0000 Subject: [PATCH] Some cleanup in tpm-related files. Signed-off-by: Stefan Berger --- linux-2.6-xen-sparse/arch/xen/Kconfig | 2 + .../drivers/xen/tpmback/interface.c | 273 +++++++++--------- .../drivers/xen/tpmfront/tpmfront.c | 21 +- .../drivers/xen/tpmfront/tpmfront.h | 6 +- tools/python/xen/xend/server/tpmif.py | 2 +- xen/include/public/io/tpmif.h | 14 +- 6 files changed, 163 insertions(+), 155 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/xen/Kconfig b/linux-2.6-xen-sparse/arch/xen/Kconfig index 07b5e85cee..31751c41f3 100644 --- a/linux-2.6-xen-sparse/arch/xen/Kconfig +++ b/linux-2.6-xen-sparse/arch/xen/Kconfig @@ -73,6 +73,8 @@ config XEN_NETDEV_BACKEND config XEN_TPMDEV_FRONTEND bool "TPM-device frontend driver" default n + select TCG_TPM + select TCG_XEN help The TPM-device frontend driver. diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c index 5343289f20..3c585e6bcd 100644 --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c @@ -1,4 +1,4 @@ -/****************************************************************************** + /****************************************************************************** * drivers/xen/tpmback/interface.c * * Vritual TPM interface management. @@ -21,180 +21,175 @@ static kmem_cache_t *tpmif_cachep; int num_frontends = 0; -LIST_HEAD(tpmif_list); +LIST_HEAD(tpmif_list); -tpmif_t *alloc_tpmif(domid_t domid, long int instance) +tpmif_t * +alloc_tpmif(domid_t domid, long int instance) { - struct page *page; - tpmif_t *tpmif; + struct page *page; + tpmif_t *tpmif; - tpmif = kmem_cache_alloc(tpmif_cachep, GFP_KERNEL); - if (!tpmif) - return ERR_PTR(-ENOMEM); + tpmif = kmem_cache_alloc(tpmif_cachep, GFP_KERNEL); + if (!tpmif) + return ERR_PTR(-ENOMEM); - memset(tpmif, 0, sizeof(*tpmif)); - tpmif->domid = domid; - tpmif->status = DISCONNECTED; - tpmif->tpm_instance = instance; - atomic_set(&tpmif->refcnt, 1); + memset(tpmif, 0, sizeof (*tpmif)); + tpmif->domid = domid; + tpmif->status = DISCONNECTED; + tpmif->tpm_instance = instance; + atomic_set(&tpmif->refcnt, 1); - page = balloon_alloc_empty_page_range(TPMIF_TX_RING_SIZE); - BUG_ON(page == NULL); - tpmif->mmap_vstart = (unsigned long)pfn_to_kaddr(page_to_pfn(page)); + page = balloon_alloc_empty_page_range(TPMIF_TX_RING_SIZE); + BUG_ON(page == NULL); + tpmif->mmap_vstart = (unsigned long)pfn_to_kaddr(page_to_pfn(page)); - list_add(&tpmif->tpmif_list, &tpmif_list); - num_frontends++; + list_add(&tpmif->tpmif_list, &tpmif_list); + num_frontends++; - return tpmif; + return tpmif; } - -void free_tpmif(tpmif_t *tpmif) +void +free_tpmif(tpmif_t * tpmif) { - num_frontends--; - list_del(&tpmif->tpmif_list); - kmem_cache_free(tpmif_cachep, tpmif); + num_frontends--; + list_del(&tpmif->tpmif_list); + kmem_cache_free(tpmif_cachep, tpmif); } - -tpmif_t *tpmif_find(domid_t domid, long int instance) +tpmif_t * +tpmif_find(domid_t domid, long int instance) { - tpmif_t *tpmif; - - list_for_each_entry(tpmif, &tpmif_list, tpmif_list) { - if (tpmif->tpm_instance == instance) { - if (tpmif->domid == domid) { - tpmif_get(tpmif); - return tpmif; - } else { - return NULL; - } - } - } - - return alloc_tpmif(domid, instance); + tpmif_t *tpmif; + + list_for_each_entry(tpmif, &tpmif_list, tpmif_list) { + if (tpmif->tpm_instance == instance) { + if (tpmif->domid == domid) { + tpmif_get(tpmif); + return tpmif; + } else { + return NULL; + } + } + } + + return alloc_tpmif(domid, instance); } - -static int map_frontend_page(tpmif_t *tpmif, unsigned long localaddr, - unsigned long shared_page) +static int +map_frontend_page(tpmif_t * tpmif, unsigned long localaddr, + unsigned long shared_page) { - struct gnttab_map_grant_ref op = { - .host_addr = localaddr, - .flags = GNTMAP_host_map, - .ref = shared_page, - .dom = tpmif->domid, - }; - - BUG_ON( HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1) ); - - if (op.handle < 0) { - DPRINTK(" Grant table operation failure !\n"); - return op.handle; - } - - tpmif->shmem_ref = shared_page; - tpmif->shmem_handle = op.handle; - tpmif->shmem_vaddr = localaddr; - return 0; + struct gnttab_map_grant_ref op = { + .host_addr = localaddr, + .flags = GNTMAP_host_map, + .ref = shared_page, + .dom = tpmif->domid, + }; + + BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1)); + + if (op.handle < 0) { + DPRINTK(" Grant table operation failure !\n"); + return op.handle; + } + + tpmif->shmem_ref = shared_page; + tpmif->shmem_handle = op.handle; + tpmif->shmem_vaddr = localaddr; + return 0; } - -static void unmap_frontend_page(tpmif_t *tpmif) +static void +unmap_frontend_page(tpmif_t * tpmif) { - struct gnttab_unmap_grant_ref op; + struct gnttab_unmap_grant_ref op; - op.host_addr = tpmif->shmem_vaddr; - op.handle = tpmif->shmem_handle; - op.dev_bus_addr = 0; + op.host_addr = tpmif->shmem_vaddr; + op.handle = tpmif->shmem_handle; + op.dev_bus_addr = 0; - BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); + BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); } - -int tpmif_map(tpmif_t *tpmif, - unsigned long shared_page, unsigned int evtchn) +int +tpmif_map(tpmif_t * tpmif, unsigned long shared_page, unsigned int evtchn) { - struct vm_struct *vma; - evtchn_op_t op = { .cmd = EVTCHNOP_bind_interdomain }; - int err; - - BUG_ON(tpmif->remote_evtchn); - - if ( (vma = get_vm_area(PAGE_SIZE, VM_IOREMAP)) == NULL ) - return -ENOMEM; - - err = map_frontend_page(tpmif, - VMALLOC_VMADDR(vma->addr), - shared_page); - if (err) { - vfree(vma->addr); - return err; - } - - op.u.bind_interdomain.dom1 = DOMID_SELF; - op.u.bind_interdomain.dom2 = tpmif->domid; - op.u.bind_interdomain.port1 = 0; - op.u.bind_interdomain.port2 = evtchn; - err = HYPERVISOR_event_channel_op(&op); - if (err) { - unmap_frontend_page(tpmif); - vfree(vma->addr); - return err; - } - - tpmif->evtchn = op.u.bind_interdomain.port1; - tpmif->remote_evtchn = evtchn; - - tpmif->tx = (tpmif_tx_interface_t *) vma->addr; - - bind_evtchn_to_irqhandler(tpmif->evtchn, - tpmif_be_int, - 0, - "tpmif-backend", - tpmif); - tpmif->status = CONNECTED; - tpmif->shmem_ref = shared_page; - tpmif->active = 1; - - return 0; + struct vm_struct *vma; + evtchn_op_t op = {.cmd = EVTCHNOP_bind_interdomain }; + int err; + + BUG_ON(tpmif->remote_evtchn); + + if ((vma = get_vm_area(PAGE_SIZE, VM_IOREMAP)) == NULL) + return -ENOMEM; + + err = map_frontend_page(tpmif, VMALLOC_VMADDR(vma->addr), shared_page); + if (err) { + vfree(vma->addr); + return err; + } + + op.u.bind_interdomain.dom1 = DOMID_SELF; + op.u.bind_interdomain.dom2 = tpmif->domid; + op.u.bind_interdomain.port1 = 0; + op.u.bind_interdomain.port2 = evtchn; + err = HYPERVISOR_event_channel_op(&op); + if (err) { + unmap_frontend_page(tpmif); + vfree(vma->addr); + return err; + } + + tpmif->evtchn = op.u.bind_interdomain.port1; + tpmif->remote_evtchn = evtchn; + + tpmif->tx = (tpmif_tx_interface_t *) vma->addr; + + bind_evtchn_to_irqhandler(tpmif->evtchn, + tpmif_be_int, 0, "tpmif-backend", tpmif); + tpmif->status = CONNECTED; + tpmif->shmem_ref = shared_page; + tpmif->active = 1; + + return 0; } - -static void __tpmif_disconnect_complete(void *arg) +static void +__tpmif_disconnect_complete(void *arg) { - evtchn_op_t op = { .cmd = EVTCHNOP_close }; - tpmif_t *tpmif = (tpmif_t *) arg; + evtchn_op_t op = {.cmd = EVTCHNOP_close }; + tpmif_t *tpmif = (tpmif_t *) arg; - op.u.close.port = tpmif->evtchn; - op.u.close.dom = DOMID_SELF; - HYPERVISOR_event_channel_op(&op); - op.u.close.port = tpmif->remote_evtchn; - op.u.close.dom = tpmif->domid; - HYPERVISOR_event_channel_op(&op); + op.u.close.port = tpmif->evtchn; + op.u.close.dom = DOMID_SELF; + HYPERVISOR_event_channel_op(&op); + op.u.close.port = tpmif->remote_evtchn; + op.u.close.dom = tpmif->domid; + HYPERVISOR_event_channel_op(&op); - if (tpmif->evtchn) - unbind_evtchn_from_irqhandler(tpmif->evtchn, tpmif); + if (tpmif->evtchn) + unbind_evtchn_from_irqhandler(tpmif->evtchn, tpmif); - if (tpmif->tx) { - unmap_frontend_page(tpmif); - vfree(tpmif->tx); - } + if (tpmif->tx) { + unmap_frontend_page(tpmif); + vfree(tpmif->tx); + } - free_tpmif(tpmif); + free_tpmif(tpmif); } - -void tpmif_disconnect_complete(tpmif_t * tpmif) +void +tpmif_disconnect_complete(tpmif_t * tpmif) { - INIT_WORK(&tpmif->work, __tpmif_disconnect_complete, (void *)tpmif); - schedule_work(&tpmif->work); + INIT_WORK(&tpmif->work, __tpmif_disconnect_complete, (void *)tpmif); + schedule_work(&tpmif->work); } - -void __init tpmif_interface_init(void) +void __init +tpmif_interface_init(void) { - tpmif_cachep = kmem_cache_create("tpmif_cache", sizeof(tpmif_t), - 0, 0, NULL, NULL); + tpmif_cachep = kmem_cache_create("tpmif_cache", sizeof (tpmif_t), + 0, 0, NULL, NULL); } diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c index ae94b3bbef..6cada9ae14 100644 --- a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c +++ b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c @@ -257,18 +257,24 @@ static int setup_tpmring(struct xenbus_device *dev, tpm_allocate_buffers(tp); - info->ring_ref = gnttab_claim_grant_reference(&gref_head); - ASSERT(info->ring_ref != -ENOSPC); - gnttab_grant_foreign_access_ref(info->ring_ref, - backend_id, - (virt_to_machine(tp->tx) >> PAGE_SHIFT), - 0); + err = gnttab_grant_foreign_access(backend_id, + (virt_to_machine(tp->tx) >> PAGE_SHIFT), + 0); + + if (err == -ENOSPC) { + free_page((unsigned long)sring); + tp->tx = NULL; + xenbus_dev_error(dev, err, "allocating grant reference"); + return err; + } + info->ring_ref = err; op.u.alloc_unbound.dom = backend_id; err = HYPERVISOR_event_channel_op(&op); if (err) { + gnttab_end_foreign_access(info->ring_ref, 0); free_page((unsigned long)sring); - tp->tx = 0; + tp->tx = NULL; xenbus_dev_error(dev, err, "allocating event channel"); return err; } @@ -282,6 +288,7 @@ static void destroy_tpmring(struct tpmfront_info *info, struct tpm_private *tp) tpmif_set_connected_state(tp,0); if ( tp->tx != NULL ) { + gnttab_end_foreign_access(info->ring_ref, 0); free_page((unsigned long)tp->tx); tp->tx = NULL; } diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.h b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.h index d1d744d6d6..28d76e176f 100644 --- a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.h +++ b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.h @@ -2,7 +2,8 @@ #define TPM_FRONT_H -struct tpm_private { +struct tpm_private +{ tpmif_tx_interface_t *tx; unsigned int evtchn; int connected; @@ -29,7 +30,8 @@ struct tpmfront_info }; -struct tx_buffer { +struct tx_buffer +{ unsigned int size; // available space in data unsigned int len; // used space in data unsigned char *data; // pointer to a page diff --git a/tools/python/xen/xend/server/tpmif.py b/tools/python/xen/xend/server/tpmif.py index a2fc2c6335..50e8f7f016 100644 --- a/tools/python/xen/xend/server/tpmif.py +++ b/tools/python/xen/xend/server/tpmif.py @@ -39,7 +39,7 @@ class TPMifController(DevController): """@see DevController.getDeviceDetails""" devid = int(sxp.child_value(config, 'instance', '0')) - log.error("The domain has a TPM with instance %d." % devid) + log.debug("The domain has a TPM with instance %d." % devid) back = { 'instance' : "%i" % devid } front = { 'handle' : "%i" % devid } diff --git a/xen/include/public/io/tpmif.h b/xen/include/public/io/tpmif.h index ee5689c1a1..29ad2d227f 100644 --- a/xen/include/public/io/tpmif.h +++ b/xen/include/public/io/tpmif.h @@ -20,8 +20,7 @@ typedef struct { unsigned long addr; /* Machine address of packet. */ int ref; /* grant table access reference */ u16 id; /* Echoed in response message. */ - u16 size:15; /* Packet size in bytes. */ - u16 mapped:1; + u16 size; /* Packet size in bytes. */ } tpmif_tx_request_t; /* @@ -30,13 +29,16 @@ typedef struct { */ typedef u32 TPMIF_RING_IDX; -#define TPMIF_TX_RING_SIZE 16 +#define TPMIF_TX_RING_SIZE 10 /* This structure must fit in a memory page. */ + +typedef struct { + tpmif_tx_request_t req; +} tpmif_ring_t; + typedef struct { - union { - tpmif_tx_request_t req; - } ring[TPMIF_TX_RING_SIZE]; + tpmif_ring_t ring[TPMIF_TX_RING_SIZE]; } tpmif_tx_interface_t; #endif -- 2.30.2